package com.mvc.service.impl;

import java.util.Calendar;
import java.util.Date;

import com.common.utils.DateUtil;
import com.common.utils.StringUtil;
import com.jfinal.kit.PropKit;
import com.mvc.model.User;
import com.mvc.request.ReqUserForget;
import com.mvc.request.ReqUserPwd;
import com.mvc.request.ReqUserSign;
import com.mvc.request.ReqLogin;
import com.mvc.request.ReqUserAdd;
import com.mvc.request.ReqUserUpdate;
import com.mvc.request.ReturnData;
import com.mvc.response.Code;
import com.mvc.response.RspSign;
import com.mvc.service.UserService;

/**
 * 用户业务
 */
public class UserServiceImpl implements UserService {

	@Override
	public ReturnData<User> login(ReqLogin req_Login) {

		if (req_Login == null) {
			return new ReturnData<User>(null, 500, "请求参数不完整!");
		}
		// 1 信息完整性判断
		if (StringUtil.isEmpty(req_Login.getUser())) {
			return new ReturnData<User>(null, 202, "账号不能为空!");
		}

		if (StringUtil.isEmpty(req_Login.getPwd())) {
			return new ReturnData<User>(null, 202, "密码不能为空!");
		}

		User user = User.dao.findLoginUser(req_Login.getUser(),
				req_Login.getPwd());

		if (user != null) {
			user.set("mac", req_Login.getFinalData().getMac());
			user.update();
			return new ReturnData<User>(user, 200, "登录成功!");

		} else {
			return new ReturnData<User>(null, 201, "账号或密码不正确!");
		}

	}

	@Override
	public ReturnData<User> create(ReqUserAdd userAdd) {

		if (userAdd == null) {
			return new ReturnData<User>(null, 500, "请求参数不完整!");
		}
		// 1 信息完整性判断
		if (StringUtil.isEmpty(userAdd.getUser())) {
			return new ReturnData<User>(null, 202, "账号不能为空!");
		}

		if (StringUtil.isEmpty(userAdd.getPwd())) {

			return new ReturnData<User>(null, 202, "密码不能为空!");
		}
		// 2 判断账号是否存在
		User user = User.dao.findUserByName(userAdd.getUser());
		if (user != null) {
			return new ReturnData<User>(null, 202, "账号已存在!");
		}
		// 3 进行注册
		User newUser = new User();
		newUser.set("name", userAdd.getUser());
		newUser.set("user", userAdd.getUser());
		newUser.set("pwd", userAdd.getPwd());
		newUser.set("mac", userAdd.getFinalData().getMac());
		newUser.set("code", userAdd.getFinalData().getCode());
		newUser.set("deviceType", userAdd.getFinalData().getType());
		newUser.set("money", 1000);
		newUser.set("sex", 0);

		// 注册送会员天数
		int vipday = PropKit.getInt("vipDay");
		Calendar calendar = Calendar.getInstance();
		newUser.set("vipstarttime", calendar.getTime());
		calendar.set(Calendar.DATE, vipday);
		newUser.set("vipendtime", calendar.getTime());

		if (newUser.save()) {

			return new ReturnData<User>(newUser, 200, "注册成功!");
		} else {

			return new ReturnData<User>(null, 201, "注册失败!");
		}
	}

	@Override
	public ReturnData<Boolean> update(ReqUserUpdate user_update) {
		if (user_update == null) {
			return new ReturnData<Boolean>(false, 500, "请求参数不完整!");
		}
		// 1 是否登录
		if (user_update.getUserId() <= 0) {
			return new ReturnData<Boolean>(false, 202, "请登录!");
		}

		// 2 用户是否存在
		User user = User.dao.findById(user_update.getUserId());
		if (user == null) {
			return new ReturnData<Boolean>(false, 202, "当前用户不存在,请重新登录!");
		}
		// 3 判断用户mac 与 数据库mac是否相同返回都是 错误400
		if (!user_update.getFinalData().getMac().equals(user.getStr("mac"))) {
			return new ReturnData<Boolean>(false, 400, "当前用户已在其他设备登录，请重新登录!");
		}

		// 4 进行更新
		user.set("email", user_update.getEmail());
		user.set("head", user_update.getHeadId());
		user.set("sex", user_update.getSex());
		user.set("name", user_update.getName());

		if (user.update()) {
			return new ReturnData<Boolean>(true, 200, "更新成功!");
		} else {

			return new ReturnData<Boolean>(false, 201, "更新失败!");
		}
	}

	@Override
	public ReturnData<Boolean> delete(String idValues) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public ReturnData<Boolean> updatePsd(ReqUserPwd reqPwd) {
		if (reqPwd == null) {
			return new ReturnData<Boolean>(false, 500, "请求参数不完整!");

		}
		// 1 信息完整性判断
		if (reqPwd.getUserId() <= 0) {
			return new ReturnData<Boolean>(false, 202, "请登录!");
		}

		if (StringUtil.isEmpty(reqPwd.getNewPsd())) {
			return new ReturnData<Boolean>(false, 202, "新密码不能为空!");
		}

		User user = User.dao.findById(reqPwd.getUserId());
		if (user == null) {
			return new ReturnData<Boolean>(false, 202, "用户不存在!");
		}

		// 3 判断用户mac 与 数据库mac是否相同返回都是 错误400
		if (!reqPwd.getFinalData().getMac().equals(user.getStr("mac"))) {
			return new ReturnData<Boolean>(false, 400, "当前用户已在其他设备登录，请重新登录!");
		}

		user.set("pwd", reqPwd.getNewPsd());
		if (user.update()) {
			return new ReturnData<Boolean>(true, 200, "密码更新成功!");

		} else {
			return new ReturnData<Boolean>(false, 201, "密码更新失败!");
		}

	}

	@Override
	public ReturnData<Boolean> forgetPsd(ReqUserForget reqForget) {
		if (reqForget == null) {
			return new ReturnData<Boolean>(false, 500, "请求参数不完整!");
		}
		// 1 信息完整性判断
		if (StringUtil.isEmpty(reqForget.getUser())) {
			return new ReturnData<Boolean>(false, 202, "账号不能为空!");
		}

		if (StringUtil.isEmpty(reqForget.getEmail())) {
			return new ReturnData<Boolean>(false, 202, "验证邮箱不能为空!");
		}
		User user = User.dao.findUserByName(reqForget.getUser());

		if (user != null) {
			if (!user.getStr("email").equals(reqForget.getEmail())) {
				return new ReturnData<Boolean>(false, 201, "请输入不正确邮箱!");
			}

			// TODO 发生邮件
			return new ReturnData<Boolean>(true, 200, "邮件发送成功，请进入邮箱进行验证!");
		} else {
			return new ReturnData<Boolean>(false, 201, "用户不存在!");
		}
	}

	@Override
	public ReturnData<Boolean> recharge() {
		return null;

	}

	@Override
	public ReturnData<RspSign> sign(ReqUserSign req) {
		if (req == null) {
			return new ReturnData<RspSign>(null, 500, "请求参数不完整!");
		}

		// 1 是否登录
		if (req.getUserId() <= 0) {
			return new ReturnData<RspSign>(null, 202, "请登录!");
		}

		// 2 用户是否存在
		User user = User.dao.findById(req.getUserId());
		if (user == null) {
			return new ReturnData<RspSign>(null, 202, "当前用户不存在,请重新登录!");
		}
		// 3 判断用户mac 与 数据库mac是否相同返回都是 错误400
		if (!req.getFinalData().getMac().equals(user.getStr("mac"))) {
			return new ReturnData<RspSign>(null, 400, "当前用户已在其他设备登录，请重新登录!");
		}

		String sigNowDate = DateUtil.getDate(new Date());
		if (sigNowDate.equals(user.getStr(User.TableField.SIGNDATE)))
		{
			 return new ReturnData<RspSign>(null, Code.CODE_202, "已签到!");
		}
		
		// 签到第几天*(20 + 会员类型*10)
		int signSize = user.getInt(User.TableField.SIGNSIZE)+1;
		int vipType =  user.getInt(User.TableField.TYPE);
		//会员类型 0 普通会员，1VIP 2年会员  3游客
		int money = signSize * (10 + vipType * 10);
		
		user.set(User.TableField.MONEY, money + user.getLong(User.TableField.MONEY));
		user.set(User.TableField.SIGNDATE, sigNowDate);
		user.set(User.TableField.SIGNSIZE, signSize);
		if (user.update()) {
			RspSign rsp = new RspSign();
			rsp.setSignMoney(money);
			rsp.setMoeny(money);
			rsp.setSize(signSize);
			rsp.setDate(sigNowDate);
			return new ReturnData<RspSign>(rsp, 200, "签到成功!");
		} else {
			return new ReturnData<RspSign>(null, 201, "签到失败!");
		}

	}
}
